/**
 * 新增自定义验证规则
 * @author pigy
 * 2014.12.25
 */

// 身份证验证   
jQuery.validator.addMethod("idCard", function(value, element, param) {   
    var idCard = /^((\d{18}$|^\d{17}(\d|X|x))|(\d{15}$|^\d{14}(\d|X|x)))$/;
    if(idCard.test(value)){
       if($(param).length>0){
       	  var birthday;
       	  if(value.length == 15){  
      	  	birthday = "19"+value.substr(6,6);  
 	      } else if(value.length == 18){  
      	  	birthday = value.substr(6,8);  
   	   	  }
       	  birthday = birthday.replace(/(.{4})(.{2})/,"$1-$2-");
       	  //计算年龄
       	  var r =  birthday.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);     
          if(r==null)return   false;     
          var  d = new Date(r[1],   r[3]-1,   r[4]);     
          if(d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4])   
          {   
              var  Y  =  new Date().getFullYear();
              if($('[name="age"]').length > 0){
              	$('[name="age"]').val(Y-r[1]); 
              }  
          }   
       	  
       	  
       	  $(param).val(birthday);
       }
    }
    return this.optional(element) || (idCard.test(value));
}, "请正确填写您的身份证号码");
//增加身份证class验证规则
jQuery.validator.addClassRules("idCard", {
  idCard: true
});

// 身份证验证
jQuery.validator.addMethod("birthday", function(value, element, param) {

        if($(param).length>0){
            //计算年龄
            var r =  value.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
            if(r==null)return   true;
            var  d = new Date(r[1],   r[3]-1,   r[4]);
            if(d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4])
            {
                var  Y  =  new Date().getFullYear();
                if( $(param).length > 0){
                    $(param).val(Y-r[1]);
                }
            }
        }
    return true;
}, "");
//增加身份证class验证规则
jQuery.validator.addClassRules("birthday", {
    birthday: true
});

//手机号码验证
jQuery.validator.addMethod("mobile", function(value, element,param) {
    var length = value.length;
    var mobile =  /^(13|14|15|17|18)[0-9]{9}$/;
    if(mobile.test(value)){
	    if($(param).length>0){
	    	$(param).val(value);
	    }
    }
    return this.optional(element) || (length == 11 && mobile.test(value));
}, "请正确填写您的手机号码"); 

//增加手机号码class验证规则
jQuery.validator.addClassRules("mobile", {
	mobile: true
});


//手机(电话)号码验证
jQuery.validator.addMethod("contactNumber", function(value, element,param) {
    var length = value.length;
    var mobile =  /^(13|14|15|17|18)[0-9]{9}$/;
    var telphone = /^(\d{3,4}-?)?\d{7,9}$/;
     if(mobile.test(value) || telphone.test(value)){
	    if($(param).length>0){
	    	$(param).val(value);
	    }
    }
    
    return this.optional(element) || (length == 11 && mobile.test(value) || (telphone.test(value) && !(/^1.*$/.test(value))));
}, "请正确填写您的手机号码(电话号码)"); 

//增加手机(电话)号码验证class验证规则
jQuery.validator.addClassRules("contactNumber", {
	contactNumber: true
});

//手机(电话)号码验证 -- 多个号码
jQuery.validator.addMethod("multipleNumber", function(value, element,param) {
	 var multiple = /^((\d{3,4}-?)?\d{7,9}( |,|，)(13|14|15|17|18)[0-9]{9})|((13|14|15|17|18)[0-9]{9}( |,|，)(\d{3,4}-?)?\d{7,9})$/;
	 var mobile =  /^(13|14|15|17|18)[0-9]{9}$/;
     var telphone = /^(\d{3,4}-?)?\d{7,9}$/;
    return this.optional(element) || ( multiple.test(value) || mobile.test(value) || telphone.test(value) );
}, "请正确填写您的手机号码(电话号码)多个号码以,分割"); 

//增加手机(电话)号码验证class验证规则
jQuery.validator.addClassRules("multipleNumber", {
    multipleNumber: true
});


//名字
jQuery.validator.addMethod("nameTxt", function(value, element,param) {
    var userName = /^[A-Za-z0-9_\-\u4e00-\u9fa5]+$/;
    return this.optional(element) || (userName.test(value) );
}, "请输入正确用户名(中英文、数字)");

//名字
jQuery.validator.addClassRules("nameTxt", {
    nameTxt: true
});

//密码
/**
 * @param param eg #account 元素选择器
 */
jQuery.validator.addMethod("password", function(value, element,param) {
    //长度8位以上
    if(value.length < 8){
        $.extend($.validator.messages, {
            password: "密码长度需8位以上"
        });
        return false;
    }
    //密码不能等于ws12345678
    if(value == "ws12345678"){
        $.extend($.validator.messages, {
            password: "密码不能等于ws12345678"
        });
        return false;
    }
    //密码不能含有账号
    if(undefined != param && param != true && $(param).length>0 ){
        var _account = $(param).val();  //账号
        if(_account != undefined && _account.trim().length > 0 && value.indexOf(_account) > -1){
            $.extend($.validator.messages, {
                password: "密码不能含有账号"
            });
            return false;
        }
    }
    /**
     * ASCII码
     * 32～126(共95个)是字符(32是空格），其中48～57为0到9十个阿拉伯数字。
     * 65～90为26个大写英文字母，97～122号为26个小写英文字母
     */
    var char_minIndex = 32, //字符开始(包含数字、特殊字符、大小写字母)
        char_maxIndex = 126, //字符结束(包含数字、特殊字符、大小写字母)
        n_minIndex = 48,    //阿拉伯数字起始ASCII码值
        n_maxIndex=57,      //阿拉伯数字结束ASCII码值
        dx_minIndex=65,      //大写字母起始ASCII码值
        dx_maxIndex=90,      //大写字母结束ASCII码值
        xx_minIndex=97,      //小写字母起始ASCII码值
        xx_maxIndex=122;     //小写字母结束ASCII码值

    var dataType = {
      sz:0,  //数字数量
      zf:0,  //字符数量
      dx:0,  //大写字母数量
      xx:0   //小写字母数量
    };
    //先将字符串转换成数组
    var charArray = value.split("");
    //遍历数组
    $.each(charArray, function (i, _this) {
        var cur_index = _this.charCodeAt();
        console.info(_this+":"+cur_index);
        //不属于可视字符跳过
        if(cur_index < char_minIndex || cur_index > char_maxIndex){
            return true;    //continue
        }
        if(cur_index >= n_minIndex && cur_index <= n_maxIndex){
            dataType.sz++;
        }else if(cur_index >= dx_minIndex && cur_index <= dx_maxIndex){
            dataType.dx++;
        }else if(cur_index >= xx_minIndex && cur_index <= xx_maxIndex){
            dataType.xx++;
        }else{
            dataType.zf++;
        }
    });
    var flagNum = 0;
    if(dataType.sz > 0){
        flagNum++;
    }if(dataType.dx > 0){
        flagNum++;
    }if(dataType.xx > 0){
        flagNum++;
    }if(dataType.zf > 0){
        flagNum++;
    }
    //不得少于两种类型
    if(flagNum < 2){
        $.extend($.validator.messages, {
            password: "大小写字母、数字、特殊字符必须至少含有2种类型"
        });
        return false;
    }
    return true;
}, "密码格式错误");

//密码
jQuery.validator.addClassRules("password", {
    password: true
});






/**
 *	特殊验证：当应用此验证规则时，如果值为空，则设置默认值0
 */
jQuery.validator.addMethod("defaultInt", function(value, element) {
    var length = value.length;
    if(length == 0 || "" == value){
    	$(element).val(0);
    }
    return true;
}, "");


//增加特殊验证class验证规则
jQuery.validator.addClassRules("defaultInt", {
	defaultInt: true
});